package com.woniuxy.interceptor;

import com.alibaba.fastjson.JSON;
import com.woniuxy.util.JWTUtil;
import com.woniuxy.util.ResponseData;
import com.woniuxy.util.ResponseEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * @author ：CuiYC
 * @description：
 * @date ：Created in 2025/3/11 11:15
 * @modified By：
 * 登录拦截器
 *   1:实现接口HandlerInterceptor
 *   2:重写方法preHandle()
 *   3:注册拦截器
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Override
    public boolean preHandle(HttpServletRequest request
            , HttpServletResponse response, Object handler) throws Exception {
        /**
         * 校验jwt合法性
         *      1:从请求头中获取jwt
         *      2:校验jwt
         *          用系统密钥解密jwt——合法性
         *      3：拿前端jwt和redis中的jwt进行对比——给redis的value设置过期时间
         */
        // 1:从请求头中获取jwt
        String headerJWT = request.getHeader("token");
        String jsonString = JSON.toJSONString(ResponseData.fail(ResponseEnum.NO_LOGIN));
        if(headerJWT == null){
            //给前端响应数据
                //axios不会把java对象转化为json对象。axios只能把json字符串转化为json对象
                //controller层mvc自动转java为json。这里脱离了controller层，所以要手动将Java对象转json字符串
            response.getWriter().print(jsonString);
            // 未登录,拦截
            return false;
        }

        if(!JWTUtil.verifyJWT(headerJWT)){
            response.getWriter().print(jsonString);
            // 解密失败
            return false;
        }
        // 3：拿前端jwt和redis中的jwt进行对比——给redis的value设置过期时间
        Integer userId = JWTUtil.getUserId(headerJWT);
        String redisJWT = (String) redisTemplate.opsForValue().get("JWT:" + userId);
        redisTemplate.opsForValue().set("JWT:" + 2, headerJWT);
        if(!headerJWT.equals(redisJWT)){
            response.getWriter().print(jsonString);
            // 空，过期，拦截
            return false;
        }
        // 给redis的jwt的TTL时间续期
        redisTemplate.expire("JWT:" + userId, 15, TimeUnit.DAYS); //给指定的key重新设置TTL时间
        return true;
    }
}
